package com.example.demo.suanfa;

import lombok.SneakyThrows;

import javax.annotation.security.RunAs;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;

/* ━━━━━━佛祖保佑━━━━━━
 *                  ,;,,;
 *                ,;;'(    社
 *      __      ,;;' ' \   会
 *   /'  '\'~~'~' \ /'\.)  主
 * ,;(      )    /  |.     义
 *,;' \    /-.,,(   ) \    码
 *     ) /       ) / )|    农
 *     ||        ||  \)
 *     (_\       (_\
 * ━━━━━━永无BUG━━━━━━
 * @author ：zjq
 * @date ：2021/4/26 9:41
 * @description: TODO               最简单的计数器限流算法
 * @version: V1.0
 * @slogan: 天下风云出我辈，一入代码岁月催
 */
public class Jishuqi {


    /**
     * 计数器法是限流算法里最简单也是最容易实现的一种算法。比如我们规定，对于A接口来说，我们1分钟的访问次数不能超过100个。
     * 那么我们可以这么做：在一开始的时候，我们可以设置一个计数器counter，每当一个请求过来的时候，counter就加1，
     * 如果counter的值大于100并且该请求与第一个 请求的间隔时间还在1分钟之内，那么说明请求数过多；如果该请求与第一个请求的间隔时间大于1分钟，
     * 且counter的值还在限流范围内，那么就重置 counter。
     */

    public long timeStamp = System.currentTimeMillis();  // 当前时间

    public int reqCount = 0;  // 初始化计数器

    public final int limit = 8; // 时间窗口内最大请求数

    public final long interval = 1000 * 3; // 时间窗口ms


    public boolean limit() {
        long now = System.currentTimeMillis();
        if (now < timeStamp + interval) {
            // 在时间窗口内
            reqCount++;
            // 判断当前时间窗口内是否超过最大请求控制数
            return reqCount <= limit;
        } else {
            timeStamp = now;
            // 超时后重置
            reqCount = 1;
            return true;
        }
    }

}
